package com.dc.java8._1_lambda;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class LambdaTest4 {

	static List<Person> persons = Arrays.asList(
		new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000.0),  
		new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500.0),
		new Person("Floyd", "Donny", "Java programmer", "male", 36, 1800.0),  
		new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600.0),  
		new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200.0),  
		new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900.0),  
		new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300.0),  
		new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700.0),  
		new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000.0),  
		new Person("Addison", "Pam", "Java programmer", "female", 34, 1300.0));
	
	/**
	 * 通过策略模式生成一个公共的过滤 Person 类相关的方法
	 * @param persons		传入的Person 列表
	 * @param commFilter	传入的过滤实现类
	 * @return              过滤后的数据
	 */
	private List<Person> filterPerson(List<Person> persons, CommFilter<Person> commFilter){
		List<Person> pList = new ArrayList<>();
		for (Person person : persons) {
			if (commFilter.filter(person)) {
				pList.add(person);
			}
		}
		return pList;
	}

    /**
     * <1> 调用实现方法
     */
	@Test
	public void test1() {
		// 运用策略模式过滤年龄 > 35 岁的人
		filterPerson(persons, new AgeFilter())
		    .forEach(System.out::println);
	}

    /**
     * <2>通过调用匿名内部类的方式实现
     */
	@Test
	public void test2() {
		filterPerson(persons, new CommFilter<Person>() {
			@Override
			public boolean filter(Person p) {
				return p.getAge() > 35;
			}
		}).forEach(System.out::println);
	}

    /**
     * <3>通过使用 lambda 表达式的方式
     */
	@Test
	public void test3() {
		filterPerson(persons, p -> p.getAge() > 35)
                .forEach(System.out::println);
	}

    /**
     * <4> lambda + Stream API
     */
	@Test
	public void test4() {
		persons.stream()
			 .filter(p -> p.getAge() > 35)
			 .forEach(System.out::println);
	}
	
	/**
	 *  <5>通过使用 lambda 表达式的方式,添加多个条件进行筛选
	 *  添加多个条件需要将多个条件放入 { } 中
	 */
	@Test
	public void test5() {
		List<Person> ps = filterPerson(persons, p -> {
			if (p.getAge() > 35) {
				if (p.getSalary() > 1900) {
					return true;
				}
			}
			return false;
		});
		ps.forEach(System.out::println);
	}

    /**
     * <6> lambda + Stream API ,添加多个条件进行筛选
     */
	@Test
	public void test6() {
		persons.stream()
				.filter( p -> p.getAge() > 35)
				.filter( p -> p.getSalary() > 1900)
				.forEach(System.out::println);
	}

}
